/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package be.hogent.iii.project.client.netwerk;

//import be.hogent.iii.project.client.berichthandlers.BerichtHandler;

import be.hogent.iii.project.client.berichthandlers.BerichtHandler;
import be.hogent.iii.project.common.bericht.Bericht;
import com.thoughtworks.xstream.XStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.Iterator;
import java.util.List;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter;

/**
 *
 * @author Dieter Van der Stock
 */
public class Handler {
	private byte[] data = null;
            private final static String handlerPackage = "be.hogent.iii.project.client.berichthandlers.Client";
	
	public synchronized void behandelBericht(byte[] data) {
            //System.out.println("DEBUGIn behandelbericht van handler");
		this.data = data;
                XStream xStream = new XStream();
            System.out.println("Ontvangen Data in stringvorm uitschrijven");
            System.out.println("-----------------------------------------");
            System.out.println(new String(data));
            System.out.println("-----------------------------------------");
            
            try {
                //we zetten er manueel een rootelement voor om deftig te kunnen splitsen
                // nu kunnen we over alle 'kinderen' gaan, elk kind op het eerste level is nu
                // een bericht dat we moeten verwerken
                String berichten = "<root>" + new String(data) + "</root>";
                InputStream is = new ByteArrayInputStream(berichten.getBytes());
                SAXBuilder builder = new SAXBuilder();
                Document doc = builder.build(is);
                Element root = doc.getRootElement();
                List kinderen = root.getContent();
                Iterator iterator = kinderen.iterator();
                //we itereren over alle mogelijke berichten
                while(iterator.hasNext()) {
                    Element kind = (Element)iterator.next();
                    System.out.println("\nBericht van het type: " + kind.toString());
                    
                    //mbv een xml outputter kunnen we via een omweggetje dit deel naar een string zetten
                    XMLOutputter outputter = new XMLOutputter();
                    ByteArrayOutputStream out = new ByteArrayOutputStream();
                    outputter.output(kind,out);
                    String msg = out.toString();
                    
                    //we roepen van elk bericht de handler op
                    xStream = new XStream();
                    Bericht bericht = (Bericht) xStream.fromXML(msg);
                    String klassenaam = handlerPackage + bericht.getClass().getSimpleName() + "Handler";
                    Class klasse = Class.forName(klassenaam);
                    System.out.println(klasse.toString());
                    BerichtHandler handler = (BerichtHandler) klasse.newInstance();
                    System.out.println(handler.toString());
                    handler.handle(bericht);
                }
            } catch (Exception ex) {
            ex.printStackTrace();
            }  
	}
	
    //wordt even niet gebruikt
    public synchronized void wachtOpBericht() {
        //zolang we geen data hebben, wachten we
        System.out.println("DEBUGIn wachtopbericht");
        while (this.data == null) {
            try {
                this.wait();
            } catch (InterruptedException e) {
            //hier doen we niet echt iets mee
            }
        }

        System.out.println(new String(this.data)); //uiteindelijk doen we er wel iets mee natuurlijk
        this.data = null; // data resetten om terug te kunnen luisteren
    }
}

